package com.itheima.controller;/*
 *      .--,       .--,
 *     ( (  \.---./  ) )
 *     '.__/o   o\__.'
 *        {=  ^  =}
 *         >  -  <
 *        /       \
 *       //       \\
 *      //|   .   |\\
 *      "'\       /'"_.-~^`'-.
 *         \  _  /--'         `
 *       ___)( )(___
 *      (((__) (__)))    高山仰止,景行行止.虽不能至,心向往之。
 *
 * @author JiaoDaoNiu
 * @create 2022-09-24-16:02
 */

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.common.R;
import com.itheima.dto.SetmealDto;
import com.itheima.entity.Category;
import com.itheima.entity.Dish;
import com.itheima.entity.Setmeal;
import com.itheima.entity.SetmealDish;
import com.itheima.service.CategoryService;
import com.itheima.service.DishService;
import com.itheima.service.SetmealDishService;
import com.itheima.service.SetmealService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 套餐管理
 */
@RequestMapping("/setmeal")
@Slf4j
@RestController
public class SetmealController {

    @Autowired
    private SetmealService setmealService;

    @Autowired
    private CategoryService categoryService;//这边的service分页的时候因为要返回分类的名字，所以得去调查询对象方法，并返回备用


    /**
     * 新增套餐
     *
     * @param setmealDto
     * @return
     */
    @PostMapping
    public R<String> save(@RequestBody SetmealDto setmealDto) {
        log.info("套餐保存已执行{}", setmealDto);
        setmealService.saveWithDish(setmealDto);
        return R.success("新增套餐成功");
    }

    /**
     * 套餐管理的多表分页查询
     * @param page
     * @param pageSize
     * @param name
     * @return
     */
    @GetMapping("/page")
    public R<Page<SetmealDto>> page(int page, int pageSize, String name) {
        Page<Setmeal> pageInfo = new Page<>(page, pageSize);

        //定义查询条件
        LambdaQueryWrapper<Setmeal> lqw = new LambdaQueryWrapper<>();
        lqw.like(name != null, Setmeal::getName, name);
//        lqw.eq(Setmeal::getStatus, 1);
        lqw.orderByAsc(Setmeal::getUpdateTime);
        //去查询后发现套餐
        //TODO 这边的setmealService.page(pageInfo, lqw)为什么没有接受pageInfo也可以获取页面元素的值
        setmealService.page(pageInfo, lqw);//这边已经查询出来不包含套餐信息的信息
        //但是没有套餐信息，因为还没有去查询，也得把返回page的泛型改为包含所有信息的dto，dto原来是为了保证数据controller层和统一
        // 交互的

        //下面开始拷贝信息并且给套餐信息赋值
        Page<SetmealDto> dtoPage = new Page<>();
        //这里使用工具拷贝属性到dto里的字段
        BeanUtils.copyProperties(pageInfo, dtoPage, "setmealDishes");

        //通过前面获取的pageInfo的值有了，然后把排除的页面元素值拿过来一起赋值
        List<Setmeal> records = pageInfo.getRecords();
        //这边的records是不能为了方便直接用，因为这边返回的是dto了，所以list集合得改变了，准备recordDtos新集合接受新的数据重新赋值
        List<SetmealDto> recordDtos = records.stream().map((temp) -> {
            SetmealDto setmealDto = new SetmealDto();
            BeanUtils.copyProperties(temp, setmealDto);

            //这通过每个的元素的分类id传过来给到上面自动注入的categoryService调用查询分类对象
            Category category = categoryService.getById(temp.getCategoryId());
            if (category != null) {
                //获取到了每个元素的名字了，准备返回
                String categoryName = category.getName();
                //dtopage还没上场，是里面new的对象setmealDto上场收割前面获取到的name
                setmealDto.setCategoryName(categoryName);
            }
            //已经获取到了所需单个元素的所有值，现在返回到一个集合里面
            return setmealDto;
        }).collect(Collectors.toList());

        //这边上面克隆过得dtoPage,它就差一个页面集合值，这下全部齐活了，返回。
        dtoPage.setRecords(recordDtos);
        //返回
        return R.success(dtoPage);
        //非常棒，测试成功，但是少了一个非null判断
    }


    /**
     * 删除套餐
     * @param ids
     * @return
     */
    @DeleteMapping
    public R<String> delete(@RequestParam List<Long> ids){
        log.info("ids:{}",ids);
        //不仅仅要删除套餐的信息，还要删除对应的表关联关系也就是套餐与菜品的关联关系
        //实现
        setmealService.removeWithDish(ids);
        return R.success("删除成功");

    }

    /**
     * 修改停售启售
     * @param perch
     * @param ids
     * @return
     */
    @PostMapping("status/{perch}")
    public R<String> updateStemeal(@PathVariable Integer perch,@RequestParam List<Long> ids){
        log.info("{}",ids.toString());
        //更新也应该是分开更新

        for (Long id : ids) {   //遍历id
            Setmeal setmeal2 = setmealService.getById(id);
            if(!perch.equals(setmeal2.getStatus())){
                setmeal2.setStatus(perch);
            }
            setmealService.update(setmeal2);
        }

        //dasdsadasdasdasd删除套餐与菜品关系表？？？？？不对，我套餐里直接就有status，不需要关系表。。。
        //asdasdasdasd保存关系表

        return R.success("更新成功");
    }


    /**
     * 回显修改前数据
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public R<SetmealDto> getOne(@PathVariable Long id){
        log.info("----------------------------------------------------------"+String.valueOf(id));
       /* LambdaQueryWrapper<Setmeal> lqw=new LambdaQueryWrapper<>();
        lqw.eq(Setmeal::getId,id);*/
        SetmealDto setmealDto = setmealService.getWithDish(id);
        return R.success(setmealDto);
    }

    @PutMapping
    public R<String> update(@RequestBody SetmealDto setmealDto){
        setmealService.updateWithDish(setmealDto);
        return R.success("套餐修改成功");


    }

    /**
     * 根据条件查询套餐数据
     * @param setmeal
     * @return
     */
    @GetMapping("/list")
    public R<List<Setmeal>> list(Setmeal setmeal){
        LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(setmeal.getCategoryId() != null,Setmeal::getCategoryId,setmeal.getCategoryId());
        queryWrapper.eq(setmeal.getStatus() != null,Setmeal::getStatus,setmeal.getStatus());
        queryWrapper.orderByDesc(Setmeal::getUpdateTime);

        List<Setmeal> list = setmealService.list(queryWrapper);
        return R.success(list);
    }

}
